<?php

namespace app\common\services;

use IFlytek\Xfyun\Speech\IseClient;

class IseService
{
    static function starting($url,$config)
    {

//        $file_name = $_FILES['file']['name'];// 文件名
//        $file_type = $_FILES['file']['type'];// 文件MIME类型：image/png
//        $file_error = $_FILES['file']['error'];// 文件错误码：0表示上传成功
//        $file_size = $_FILES['file']['size'];// 已上传文件大小：单位为 字节
//        $file_tmp = $_FILES['file']['tmp_name'];// 存储在服务端的临时文件名
//
//        $upload_dir = __DIR__.'/../../../public';// 上传文件夹必须存在，否则将移动失败！
//
//        if(!file_exists($upload_dir)) {
//            @mkdir($upload_dir, 0777);
//        }
//// 移动上传文件至新目录（包括文件名）
//        $res = move_uploaded_file($file_tmp, $upload_dir.'/'.$file_name);
//        if($res) {
//            echo '移动上传的文件成功！',"\n";
//        } else {
//            echo '移动上传的文件失败！',"\n";
//        }
        $ttsConfig = [
            'sub'=>'ise',
            'aue'=>'lame',
            'ent'=>'en_vip'
        ];

        $text = $config['text'];
        unset($config['text']);
        if(self::hasChinese($text)){
            $ttsConfig['ent'] = 'cn_vip';
        }
        $ttsConfig += $config;

        $app_id = getenv('PHP_XFYUN_APPID');
        $api_secret = getenv('PHP_XFYUN_APISECRET');
        $api_key = getenv('PHP_XFYUN_APIKEY');

// 这里的$app_id、$api_key、$api_secret是在开放平台控制台获得
        $client = new IseClient($app_id, $api_key, $api_secret, $ttsConfig);

// 返回识别结果
        $content = $client->request($url,$text);
        if(gettype($content) == 'object'){
            return json_decode(json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE),true);
        }else{
            return json_decode(self::convert_to_json($content, 'SimpleXMLElement'),true);
        }
    }

    static function hasChinese($str)
    {
        $pattern = '/[\x{4e00}-\x{9fa5}]/u'; // Unicode编码范围内的汉字
        return preg_match($pattern, $str);
    }
// Cleans up ugly JSON data by removing @attributes tag
    static function cleanup_json ($ugly_json) {
        if (is_object($ugly_json)) {
            $nice_json = new \stdClass();
            foreach ($ugly_json as $attr => $value) {
                if ($attr == '@attributes') {
                    foreach ($value as $xattr => $xvalue) {
                        $nice_json->$xattr = $xvalue;
                    }
                } else {
                    $nice_json->$attr = self::cleanup_json($value);
                }
            }
            return $nice_json;
        } else if (is_array($ugly_json)) {
            $nice_json = array();
            foreach ($ugly_json as $n => $e) {
                $nice_json[$n] = self::cleanup_json($e);
            }
            return $nice_json;
        } else {
            return $ugly_json;
        }
    }

// Convert XML to JSON
    static function convert_to_json ($xml_string) {
        $xml = simplexml_load_string($xml_string);
        $ugly_json = json_decode(json_encode($xml,JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE));
        $nice_json = self::cleanup_json($ugly_json);
        return json_encode($nice_json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
    }

    static function get_error($code)
    {
        switch ($code){
            case '10163':
                return '参数校验失败，由客户端参数校验失败引起，客户端需要依据返回的message字段中的描述来更改请求参数';
            case '10313':
                return '请求参数 第一帧没有传app_id 或者传 的app_id 与api_key 不匹配。';
            case '40007':
                return '音频解码失败，请检查所传的音频是否与encoding字段描述的编码格式对应。';
            case '11201':
                return '接口使用量超出了购买的最大限制，请购买后继续使用。';
            case '10114':
                return '请求超时，会话时间超过了300s，请控制会话时间，保持不超过300s';
            case '10043':
                return '音频解码失败，请确保所传音频编码格式与请求参数保持一致。';
            case '10161':
                return 'base64解码失败，检查发送的数据是否使用base64编码了';
            case '10200':
                return '读取数据超时，检查是否累计10s未发送数据并且未关闭连接';
            case '10160':
                return '请求数据格式非法，检查请求数据是否是合法的json';
            case '11200':
                return '功能未授权';
            case '60114':
                return '评测音频长度过长';
            case '10139':
                return '参数错误';
            case '48196':
                return '实例禁止重复调用该接口';
            case '40006':
                return '无效参数';
            case '40010':
                return '无响应';
            case '40016':
                return '初始化失败';
            case '40017':
                return '没有初始化';
            case '40023':
                return '无效配置';
            case '40034':
                return '参数未设置';
            case '40037':
                return '无评测文本';
            case '40038':
                return '无评测语音';
            case '40040':
                return '非法数据';
            case '42306':
                return '授权数不够';
            case '68676':
                return '乱说';
            case '30002':
                return 'ssb没有cmd参数';
            case '48195':
                return '实例评测试卷未设置，试题格式错误，请检查评测文本是否与试题匹配，特别是英文题型需要在试题中加特殊标记、未设置ent、category等参数等';
            case '30011':
                return 'sid为空，如上传音频未设置aus';
            case '68675':
                return '不正常的语音数据，请检查是否为16k、16bit、单声道音频，并且检查aue参数值指定是否与音频类型匹配';
            case '48205':
                return '实例未评测，如没有获取到录音、上传音频为空导致的报错';
            default:
                return false;
        }
    }

}